/*
 * Copyright Codeplay Software Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use these files except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// DO NOT MODIFY BY HAND
// This file was automatically generated by generate_pooling_tests.py.
// Results calculated using Tensorflow v1.12.0.

#include <gtest/gtest.h>

#include "sycldnn/padding_mode.h"

#include "sycldnn/pooling/operators.h"

#include "test/types/cartesian_product.h"
#include "test/types/kernel_data_types.h"
#include "test/types/test_backend_types.h"
#include "test/types/to_gtest_types.h"

#include "test/pooling/pooling_fixture.h"

#include <array>
#include <vector>

using namespace sycldnn;  // NOLINT(google-build-using-namespace)
using DataTypeList = sycldnn::types::KernelDataTypes;
using Backends = sycldnn::types::DefaultBackendTypes;

using SNNTypePairs =
    sycldnn::types::CartesianProduct<DataTypeList, Backends>::type;
using GTestTypePairs = sycldnn::types::ToGTestTypes<SNNTypePairs>::type;

template <typename Pair>
using MaxWindow5Stride1Grad =
    PoolingFixture<typename Pair::FirstType, typename Pair::SecondType,
                   pooling::Max, pooling::Backpropagate>;
TYPED_TEST_SUITE(MaxWindow5Stride1Grad, GTestTypePairs);
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 1.,  2.,  3.,  15., 0., 0., 7.,  8.,  9.,  33.,
      0., 0., 13., 14., 15., 51., 0., 0., 75., 78., 81., 261.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2., 0., 0., 0., 0., 3., 4.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 1.,   2.,   3.,   4.,   5.,   6.,   27.,  30.,
      0., 0., 0., 0., 13.,  14.,  15.,  16.,  17.,  18.,  63.,  66.,
      0., 0., 0., 0., 25.,  26.,  27.,  28.,  29.,  30.,  99.,  102.,
      0., 0., 0., 0., 147., 150., 153., 156., 159., 162., 513., 522.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 1., 2., 3., 4., 0., 0., 0., 0., 0., 0., 0., 0., 5., 6., 7., 8.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,    0.,
      0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,    9.,    10.,
      11.,  12.,  51.,  54.,  57.,  60.,  0.,   0.,   0.,    0.,    0.,
      0.,   0.,   0.,   25.,  26.,  27.,  28.,  29.,  30.,   31.,   32.,
      33.,  34.,  35.,  36.,  123., 126., 129., 132., 0.,    0.,    0.,
      0.,   0.,   0.,   0.,   0.,   49.,  50.,  51.,  52.,   53.,   54.,
      55.,  56.,  57.,  58.,  59.,  60.,  195., 198., 201.,  204.,  0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   291., 294.,  297.,  300.,
      303., 306., 309., 312., 315., 318., 321., 324., 1017., 1026., 1035.,
      1044.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      1., 2., 3., 4., 5., 6., 7., 8., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 9., 10., 11., 12., 13., 14., 15., 16.};
  const std::array<int, 4> in_shape = {{1, 6, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,
      0., 0., 1.,  2.,  3.,  4.,  18., 0., 0., 8.,  9.,  10., 11., 39.,
      0., 0., 15., 16., 17., 18., 60., 0., 0., 87., 90., 93., 96., 306.};
  const std::array<int, 4> in_shape = {{1, 6, 7, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 1., 2., 3., 0., 0., 0., 0., 4., 5., 6.};
  const std::array<int, 4> in_shape = {{1, 6, 7, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,
      5.,  6.,  7.,   8.,   33.,  36.,  0.,   0.,   0.,   0.,   15.,  16.,
      17., 18., 19.,  20.,  21.,  22.,  75.,  78.,  0.,   0.,   0.,   0.,
      29., 30., 31.,  32.,  33.,  34.,  35.,  36.,  117., 120., 0.,   0.,
      0.,  0.,  171., 174., 177., 180., 183., 186., 189., 192., 603., 612.};
  const std::array<int, 4> in_shape = {{1, 6, 7, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.,  2.,  3., 4.,
      5., 6., 0., 0., 0., 0., 0., 0., 0., 0., 7., 8., 9., 10., 11., 12.};
  const std::array<int, 4> in_shape = {{1, 6, 7, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,
      3.,    4.,    5.,   6.,   7.,   8.,   9.,   10.,  11.,  12.,  13.,
      14.,   15.,   16.,  63.,  66.,  69.,  72.,  0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   29.,  30.,  31.,  32.,  33.,  34.,  35.,
      36.,   37.,   38.,  39.,  40.,  41.,  42.,  43.,  44.,  147., 150.,
      153.,  156.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   57.,
      58.,   59.,   60.,  61.,  62.,  63.,  64.,  65.,  66.,  67.,  68.,
      69.,   70.,   71.,  72.,  231., 234., 237., 240., 0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   339., 342., 345., 348., 351., 354.,
      357.,  360.,  363., 366., 369., 372., 375., 378., 381., 384., 1197.,
      1206., 1215., 1224.};
  const std::array<int, 4> in_shape = {{1, 6, 7, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.,  10., 11., 12.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{1, 6, 7, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,
      0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,   3.,   4.,   5.,   21.,
      0.,  0.,  9.,  10., 11., 12., 13., 45.,  0.,   0.,   17.,  18.,
      19., 20., 21., 69., 0.,  0.,  99., 102., 105., 108., 111., 351.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 1., 2., 3., 4., 0., 0., 0., 0., 5., 6., 7., 8.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,   10.,  39.,  42.,
      0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,  21.,  22.,  23.,  24.,
      25.,  26.,  87.,  90.,  0.,   0.,   0.,   0.,   33.,  34.,  35.,  36.,
      37.,  38.,  39.,  40.,  41.,  42.,  135., 138., 0.,   0.,   0.,   0.,
      195., 198., 201., 204., 207., 210., 213., 216., 219., 222., 693., 702.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 1., 2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0., 0., 0., 0., 9., 10., 11., 12., 13., 14., 15., 16.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x6x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   1.,   2.,   3.,   4.,   5.,
      6.,   7.,    8.,    9.,    10.,  11.,  12.,  13.,  14.,  15.,  16.,
      17.,  18.,   19.,   20.,   75.,  78.,  81.,  84.,  0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   33.,  34.,  35.,  36.,  37.,  38.,
      39.,  40.,   41.,   42.,   43.,  44.,  45.,  46.,  47.,  48.,  49.,
      50.,  51.,   52.,   171.,  174., 177., 180., 0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    65.,  66.,  67.,  68.,  69.,  70.,  71.,
      72.,  73.,   74.,   75.,   76.,  77.,  78.,  79.,  80.,  81.,  82.,
      83.,  84.,   267.,  270.,  273., 276., 0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    387.,  390., 393., 396., 399., 402., 405., 408.,
      411., 414.,  417.,  420.,  423., 426., 429., 432., 435., 438., 441.,
      444., 1377., 1386., 1395., 1404.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x6x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,
      7.,  8.,  9.,  10., 11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17., 18., 19., 20.,
      21., 22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32.};
  const std::array<int, 4> in_shape = {{1, 6, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0., 0.,  0.,  0.,  0.,  0.,  0., 0.,  0.,  0.,  0.,  0.,
      1.,  2.,  3., 15., 0.,  0.,  7.,  8.,  9., 33., 0.,  0.,  13., 14.,
      15., 51., 0., 0.,  19., 20., 21., 69., 0., 0.,  93., 96., 99., 315.};
  const std::array<int, 4> in_shape = {{1, 7, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      1., 2., 0., 0., 0., 0., 3., 4., 0., 0., 0., 0., 5., 6.};
  const std::array<int, 4> in_shape = {{1, 7, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 1.,   2.,   3.,   4.,   5.,   6.,   27.,  30.,
      0., 0., 0., 0., 13.,  14.,  15.,  16.,  17.,  18.,  63.,  66.,
      0., 0., 0., 0., 25.,  26.,  27.,  28.,  29.,  30.,  99.,  102.,
      0., 0., 0., 0., 37.,  38.,  39.,  40.,  41.,  42.,  135., 138.,
      0., 0., 0., 0., 183., 186., 189., 192., 195., 198., 621., 630.};
  const std::array<int, 4> in_shape = {{1, 7, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0., 0.,
      0., 0., 0., 0., 0., 1., 2., 3., 4., 0., 0., 0., 0., 0.,  0.,  0., 0.,
      5., 6., 7., 8., 0., 0., 0., 0., 0., 0., 0., 0., 9., 10., 11., 12.};
  const std::array<int, 4> in_shape = {{1, 7, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    1.,    2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,   10.,
      11.,   12.,   51.,  54.,  57.,  60.,  0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,   25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,
      33.,   34.,   35.,  36.,  123., 126., 129., 132., 0.,   0.,   0.,
      0.,    0.,    0.,   0.,   0.,   49.,  50.,  51.,  52.,  53.,  54.,
      55.,   56.,   57.,  58.,  59.,  60.,  195., 198., 201., 204., 0.,
      0.,    0.,    0.,   0.,   0.,   0.,   0.,   73.,  74.,  75.,  76.,
      77.,   78.,   79.,  80.,  81.,  82.,  83.,  84.,  267., 270., 273.,
      276.,  0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   363., 366.,
      369.,  372.,  375., 378., 381., 384., 387., 390., 393., 396., 1233.,
      1242., 1251., 1260.};
  const std::array<int, 4> in_shape = {{1, 7, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      1.,  2.,  3.,  4.,  5., 6., 7.,  8.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  9.,  10., 11., 12.,
      13., 14., 15., 16., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 17., 18., 19., 20., 21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{1, 7, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0., 0.,  0.,   0.,   0.,   0.,   0.,  0., 0.,  0.,
      0.,  0.,  0.,  1., 2.,  3.,   4.,   18.,  0.,   0.,  8., 9.,  10.,
      11., 39., 0.,  0., 15., 16.,  17.,  18.,  60.,  0.,  0., 22., 23.,
      24., 25., 81., 0., 0.,  108., 111., 114., 117., 369.};
  const std::array<int, 4> in_shape = {{1, 7, 7, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2.,
      3., 0., 0., 0., 0., 4., 5., 6., 0., 0., 0., 0., 7., 8., 9.};
  const std::array<int, 4> in_shape = {{1, 7, 7, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,  0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   1.,  2.,  3.,  4.,  5.,   6.,   7.,
      8.,   33.,  36.,  0.,   0.,   0.,   0.,  15., 16., 17., 18.,  19.,  20.,
      21.,  22.,  75.,  78.,  0.,   0.,   0.,  0.,  29., 30., 31.,  32.,  33.,
      34.,  35.,  36.,  117., 120., 0.,   0.,  0.,  0.,  43., 44.,  45.,  46.,
      47.,  48.,  49.,  50.,  159., 162., 0.,  0.,  0.,  0.,  213., 216., 219.,
      222., 225., 228., 231., 234., 729., 738.};
  const std::array<int, 4> in_shape = {{1, 7, 7, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 1.,  2.,  3.,  4.,  5.,  6.,
      0., 0., 0., 0., 0., 0., 0., 0., 7.,  8.,  9.,  10., 11., 12.,
      0., 0., 0., 0., 0., 0., 0., 0., 13., 14., 15., 16., 17., 18.};
  const std::array<int, 4> in_shape = {{1, 7, 7, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,
      9.,    10.,   11.,   12.,  13.,  14.,  15.,  16.,  63.,  66.,  69.,  72.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   29.,  30.,  31.,  32.,
      33.,   34.,   35.,   36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,  44.,
      147.,  150.,  153.,  156., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      57.,   58.,   59.,   60.,  61.,  62.,  63.,  64.,  65.,  66.,  67.,  68.,
      69.,   70.,   71.,   72.,  231., 234., 237., 240., 0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   85.,  86.,  87.,  88.,  89.,  90.,  91.,  92.,
      93.,   94.,   95.,   96.,  97.,  98.,  99.,  100., 315., 318., 321., 324.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   423., 426., 429., 432.,
      435.,  438.,  441.,  444., 447., 450., 453., 456., 459., 462., 465., 468.,
      1449., 1458., 1467., 1476.};
  const std::array<int, 4> in_shape = {{1, 7, 7, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.,  10., 11., 12.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{1, 7, 7, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,   0.,   0.,   0.,   1.,   2.,  3.,  4.,  5.,  21.,
      0.,  0.,  9.,   10.,  11.,  12.,  13.,  45., 0.,  0.,  17., 18.,
      19., 20., 21.,  69.,  0.,   0.,   25.,  26., 27., 28., 29., 93.,
      0.,  0.,  123., 126., 129., 132., 135., 423.};
  const std::array<int, 4> in_shape = {{1, 7, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 1., 2., 3., 4.,  0.,  0.,
      0., 0., 5., 6., 7., 8., 0., 0., 0., 0., 9., 10., 11., 12.};
  const std::array<int, 4> in_shape = {{1, 7, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      1.,   2.,   3.,   4.,  5.,   6.,   7.,   8.,   9.,   10.,  39.,  42.,
      0.,   0.,   0.,   0.,  17.,  18.,  19.,  20.,  21.,  22.,  23.,  24.,
      25.,  26.,  87.,  90., 0.,   0.,   0.,   0.,   33.,  34.,  35.,  36.,
      37.,  38.,  39.,  40., 41.,  42.,  135., 138., 0.,   0.,   0.,   0.,
      49.,  50.,  51.,  52., 53.,  54.,  55.,  56.,  57.,  58.,  183., 186.,
      0.,   0.,   0.,   0.,  243., 246., 249., 252., 255., 258., 261., 264.,
      267., 270., 837., 846.};
  const std::array<int, 4> in_shape = {{1, 7, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0., 0., 0., 0., 9.,  10., 11., 12., 13., 14., 15., 16.,
      0., 0., 0., 0., 0., 0., 0., 0., 17., 18., 19., 20., 21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{1, 7, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x7x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      1.,   2.,   3.,   4.,   5.,    6.,    7.,    8.,   9.,   10.,  11.,  12.,
      13.,  14.,  15.,  16.,  17.,   18.,   19.,   20.,  75.,  78.,  81.,  84.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   33.,  34.,  35.,  36.,
      37.,  38.,  39.,  40.,  41.,   42.,   43.,   44.,  45.,  46.,  47.,  48.,
      49.,  50.,  51.,  52.,  171.,  174.,  177.,  180., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   65.,   66.,   67.,   68.,  69.,  70.,  71.,  72.,
      73.,  74.,  75.,  76.,  77.,   78.,   79.,   80.,  81.,  82.,  83.,  84.,
      267., 270., 273., 276., 0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      97.,  98.,  99.,  100., 101.,  102.,  103.,  104., 105., 106., 107., 108.,
      109., 110., 111., 112., 113.,  114.,  115.,  116., 363., 366., 369., 372.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   483., 486., 489., 492.,
      495., 498., 501., 504., 507.,  510.,  513.,  516., 519., 522., 525., 528.,
      531., 534., 537., 540., 1665., 1674., 1683., 1692.};
  const std::array<int, 4> in_shape = {{1, 7, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x7x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,
      7.,  8.,  9.,  10., 11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17., 18., 19., 20.,
      21., 22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  33., 34.,
      35., 36., 37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{1, 7, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0.,  0., 0., 0.,   0.,   0.,   0.,
      0., 0., 1.,  2.,  3.,  15., 0., 0., 7.,   8.,   9.,   33.,
      0., 0., 13., 14., 15., 51., 0., 0., 19.,  20.,  21.,  69.,
      0., 0., 25., 26., 27., 87., 0., 0., 111., 114., 117., 369.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2., 0., 0.,
      0., 0., 3., 4., 0., 0., 0., 0., 5., 6., 0., 0., 0., 0., 7., 8.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0., 0., 0., 0., 1.,   2.,   3.,   4.,   5.,   6.,   27.,  30.,
      0., 0., 0., 0., 13.,  14.,  15.,  16.,  17.,  18.,  63.,  66.,
      0., 0., 0., 0., 25.,  26.,  27.,  28.,  29.,  30.,  99.,  102.,
      0., 0., 0., 0., 37.,  38.,  39.,  40.,  41.,  42.,  135., 138.,
      0., 0., 0., 0., 49.,  50.,  51.,  52.,  53.,  54.,  171., 174.,
      0., 0., 0., 0., 219., 222., 225., 228., 231., 234., 729., 738.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0.,  0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  0., 0., 0., 0., 1., 2., 3., 4., 0.,  0.,  0.,  0.,
      0., 0.,  0.,  0.,  5., 6., 7., 8., 0., 0., 0., 0., 0.,  0.,  0.,  0.,
      9., 10., 11., 12., 0., 0., 0., 0., 0., 0., 0., 0., 13., 14., 15., 16.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   1.,    2.,    3.,    4.,   5.,   6.,   7.,   8.,   9.,   10.,
      11.,  12.,   51.,   54.,   57.,  60.,  0.,   0.,   0.,   0.,   0.,
      0.,   0.,    0.,    25.,   26.,  27.,  28.,  29.,  30.,  31.,  32.,
      33.,  34.,   35.,   36.,   123., 126., 129., 132., 0.,   0.,   0.,
      0.,   0.,    0.,    0.,    0.,   49.,  50.,  51.,  52.,  53.,  54.,
      55.,  56.,   57.,   58.,   59.,  60.,  195., 198., 201., 204., 0.,
      0.,   0.,    0.,    0.,    0.,   0.,   0.,   73.,  74.,  75.,  76.,
      77.,  78.,   79.,   80.,   81.,  82.,  83.,  84.,  267., 270., 273.,
      276., 0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   97.,  98.,
      99.,  100.,  101.,  102.,  103., 104., 105., 106., 107., 108., 339.,
      342., 345.,  348.,  0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      435., 438.,  441.,  444.,  447., 450., 453., 456., 459., 462., 465.,
      468., 1449., 1458., 1467., 1476.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  9.,  10., 11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17., 18., 19., 20., 21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  25., 26., 27., 28., 29., 30., 31., 32.};
  const std::array<int, 4> in_shape = {{1, 8, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0.,  0.,   0., 0., 0.,   0.,   0.,   0.,   0.,
      0., 0., 1.,  2.,  3.,  4.,  18.,  0., 0., 8.,   9.,   10.,  11.,  39.,
      0., 0., 15., 16., 17., 18., 60.,  0., 0., 22.,  23.,  24.,  25.,  81.,
      0., 0., 29., 30., 31., 32., 102., 0., 0., 129., 132., 135., 138., 432.};
  const std::array<int, 4> in_shape = {{1, 8, 7, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 1., 2., 3., 0., 0., 0., 0., 4.,  5.,  6.,
      0., 0., 0., 0., 7., 8., 9., 0., 0., 0., 0., 10., 11., 12.};
  const std::array<int, 4> in_shape = {{1, 8, 7, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,  0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  0.,  0.,  0.,  0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,  3.,  4.,  5.,  6.,   7.,
      8.,   33.,  36.,  0.,   0.,   0.,   0.,   15., 16., 17., 18., 19.,  20.,
      21.,  22.,  75.,  78.,  0.,   0.,   0.,   0.,  29., 30., 31., 32.,  33.,
      34.,  35.,  36.,  117., 120., 0.,   0.,   0.,  0.,  43., 44., 45.,  46.,
      47.,  48.,  49.,  50.,  159., 162., 0.,   0.,  0.,  0.,  57., 58.,  59.,
      60.,  61.,  62.,  63.,  64.,  201., 204., 0.,  0.,  0.,  0.,  255., 258.,
      261., 264., 267., 270., 273., 276., 855., 864.};
  const std::array<int, 4> in_shape = {{1, 8, 7, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,
      1.,  2.,  3.,  4.,  5., 6., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  7.,  8.,
      9.,  10., 11., 12., 0., 0., 0., 0., 0., 0., 0.,  0.,  13., 14., 15., 16.,
      17., 18., 0.,  0.,  0., 0., 0., 0., 0., 0., 19., 20., 21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{1, 8, 7, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   1.,    2.,    3.,    4.,   5.,   6.,   7.,   8.,
      9.,   10.,  11.,  12.,  13.,   14.,   15.,   16.,  63.,  66.,  69.,  72.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   29.,  30.,  31.,  32.,
      33.,  34.,  35.,  36.,  37.,   38.,   39.,   40.,  41.,  42.,  43.,  44.,
      147., 150., 153., 156., 0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      57.,  58.,  59.,  60.,  61.,   62.,   63.,   64.,  65.,  66.,  67.,  68.,
      69.,  70.,  71.,  72.,  231.,  234.,  237.,  240., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   85.,   86.,   87.,   88.,  89.,  90.,  91.,  92.,
      93.,  94.,  95.,  96.,  97.,   98.,   99.,   100., 315., 318., 321., 324.,
      0.,   0.,   0.,   0.,   0.,    0.,    0.,    0.,   113., 114., 115., 116.,
      117., 118., 119., 120., 121.,  122.,  123.,  124., 125., 126., 127., 128.,
      399., 402., 405., 408., 0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,
      507., 510., 513., 516., 519.,  522.,  525.,  528., 531., 534., 537., 540.,
      543., 546., 549., 552., 1701., 1710., 1719., 1728.};
  const std::array<int, 4> in_shape = {{1, 8, 7, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,
      8.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  13., 14., 15., 16., 17., 18., 19., 20., 21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35.,
      36., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{1, 8, 7, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,   0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,  0.,
      0.,  0.,  0.,  0.,   0.,  1.,  2.,   3.,   4.,   5.,   21.,  0.,  0.,
      9.,  10., 11., 12.,  13., 45., 0.,   0.,   17.,  18.,  19.,  20., 21.,
      69., 0.,  0.,  25.,  26., 27., 28.,  29.,  93.,  0.,   0.,   33., 34.,
      35., 36., 37., 117., 0.,  0.,  147., 150., 153., 156., 159., 495.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1., 2.,  3.,  4.,  0., 0., 0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 9., 10., 11., 12., 0., 0., 0., 0., 13., 14., 15., 16.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,   10.,  39.,  42.,
      0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,  21.,  22.,  23.,  24.,
      25.,  26.,  87.,  90.,  0.,   0.,   0.,   0.,   33.,  34.,  35.,  36.,
      37.,  38.,  39.,  40.,  41.,  42.,  135., 138., 0.,   0.,   0.,   0.,
      49.,  50.,  51.,  52.,  53.,  54.,  55.,  56.,  57.,  58.,  183., 186.,
      0.,   0.,   0.,   0.,   65.,  66.,  67.,  68.,  69.,  70.,  71.,  72.,
      73.,  74.,  231., 234., 0.,   0.,   0.,   0.,   291., 294., 297., 300.,
      303., 306., 309., 312., 315., 318., 981., 990.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0., 0., 0., 0., 9.,  10., 11., 12., 13., 14., 15., 16.,
      0., 0., 0., 0., 0., 0., 0., 0., 17., 18., 19., 20., 21., 22., 23., 24.,
      0., 0., 0., 0., 0., 0., 0., 0., 25., 26., 27., 28., 29., 30., 31., 32.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME1x8x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      1.,    2.,    3.,    4.,   5.,   6.,   7.,   8.,   9.,   10.,  11.,  12.,
      13.,   14.,   15.,   16.,  17.,  18.,  19.,  20.,  75.,  78.,  81.,  84.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   33.,  34.,  35.,  36.,
      37.,   38.,   39.,   40.,  41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,
      49.,   50.,   51.,   52.,  171., 174., 177., 180., 0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   65.,  66.,  67.,  68.,  69.,  70.,  71.,  72.,
      73.,   74.,   75.,   76.,  77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,
      267.,  270.,  273.,  276., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      97.,   98.,   99.,   100., 101., 102., 103., 104., 105., 106., 107., 108.,
      109.,  110.,  111.,  112., 113., 114., 115., 116., 363., 366., 369., 372.,
      0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   129., 130., 131., 132.,
      133.,  134.,  135.,  136., 137., 138., 139., 140., 141., 142., 143., 144.,
      145.,  146.,  147.,  148., 459., 462., 465., 468., 0.,   0.,   0.,   0.,
      0.,    0.,    0.,    0.,   579., 582., 585., 588., 591., 594., 597., 600.,
      603.,  606.,  609.,  612., 615., 618., 621., 624., 627., 630., 633., 636.,
      1953., 1962., 1971., 1980.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID1x8x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,
      7.,  8.,  9.,  10., 11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17., 18., 19., 20.,
      21., 22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  33., 34.,
      35., 36., 37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48., 0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      49., 50., 51., 52., 53., 54., 55., 56., 57., 58., 59., 60., 61., 62., 63.,
      64.};
  const std::array<int, 4> in_shape = {{1, 8, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0.,   0., 0., 0.,   0.,   0.,   0.,
      0., 0., 1.,  2.,  3.,  15.,  0., 0., 7.,   8.,   9.,   33.,
      0., 0., 13., 14., 15., 51.,  0., 0., 75.,  78.,  81.,  261.,
      0., 0., 0.,  0.,  0.,  0.,   0., 0., 0.,   0.,   0.,   0.,
      0., 0., 37., 38., 39., 123., 0., 0., 43.,  44.,  45.,  141.,
      0., 0., 49., 50., 51., 159., 0., 0., 183., 186., 189., 585.,
      0., 0., 0.,  0.,  0.,  0.,   0., 0., 0.,   0.,   0.,   0.,
      0., 0., 73., 74., 75., 231., 0., 0., 79.,  80.,  81.,  249.,
      0., 0., 85., 86., 87., 267., 0., 0., 291., 294., 297., 909.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0.,  0., 0., 0., 0., 0.,  0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0.,  0., 0., 0., 0., 0.,  0., 1., 2., 0., 0.,
      0., 0., 3., 4., 0., 0.,  0., 0., 0., 0., 0.,  0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0.,  0., 0., 0., 0., 0.,  0., 0., 0., 0., 0.,
      5., 6., 0., 0., 0., 0.,  7., 8., 0., 0., 0.,  0., 0., 0., 0., 0.,
      0., 0., 0., 0., 0., 0.,  0., 0., 0., 0., 0.,  0., 0., 0., 0., 0.,
      0., 0., 0., 0., 9., 10., 0., 0., 0., 0., 11., 12.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 1.,   2.,   3.,   4.,   5.,   6.,   27.,   30.,
      0., 0., 0., 0., 13.,  14.,  15.,  16.,  17.,  18.,  63.,   66.,
      0., 0., 0., 0., 25.,  26.,  27.,  28.,  29.,  30.,  99.,   102.,
      0., 0., 0., 0., 147., 150., 153., 156., 159., 162., 513.,  522.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 73.,  74.,  75.,  76.,  77.,  78.,  243.,  246.,
      0., 0., 0., 0., 85.,  86.,  87.,  88.,  89.,  90.,  279.,  282.,
      0., 0., 0., 0., 97.,  98.,  99.,  100., 101., 102., 315.,  318.,
      0., 0., 0., 0., 363., 366., 369., 372., 375., 378., 1161., 1170.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 145., 146., 147., 148., 149., 150., 459.,  462.,
      0., 0., 0., 0., 157., 158., 159., 160., 161., 162., 495.,  498.,
      0., 0., 0., 0., 169., 170., 171., 172., 173., 174., 531.,  534.,
      0., 0., 0., 0., 579., 582., 585., 588., 591., 594., 1809., 1818.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2., 3., 4.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  9.,  10., 11., 12., 0., 0., 0.,
      0., 0., 0.,  0.,  0.,  13., 14., 15., 16., 0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0.,
      0., 0., 0.,  0.,  0.,  17., 18., 19., 20., 0.,  0.,  0.,  0., 0., 0.,
      0., 0., 21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    1.,    2.,    3.,    4.,
      5.,    6.,    7.,    8.,    9.,    10.,   11.,   12.,   51.,   54.,
      57.,   60.,   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      25.,   26.,   27.,   28.,   29.,   30.,   31.,   32.,   33.,   34.,
      35.,   36.,   123.,  126.,  129.,  132.,  0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    49.,   50.,   51.,   52.,   53.,   54.,
      55.,   56.,   57.,   58.,   59.,   60.,   195.,  198.,  201.,  204.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    291.,  294.,
      297.,  300.,  303.,  306.,  309.,  312.,  315.,  318.,  321.,  324.,
      1017., 1026., 1035., 1044., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      145.,  146.,  147.,  148.,  149.,  150.,  151.,  152.,  153.,  154.,
      155.,  156.,  483.,  486.,  489.,  492.,  0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    169.,  170.,  171.,  172.,  173.,  174.,
      175.,  176.,  177.,  178.,  179.,  180.,  555.,  558.,  561.,  564.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    193.,  194.,
      195.,  196.,  197.,  198.,  199.,  200.,  201.,  202.,  203.,  204.,
      627.,  630.,  633.,  636.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    723.,  726.,  729.,  732.,  735.,  738.,  741.,  744.,
      747.,  750.,  753.,  756.,  2313., 2322., 2331., 2340., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    289.,  290.,  291.,  292.,  293.,  294.,
      295.,  296.,  297.,  298.,  299.,  300.,  915.,  918.,  921.,  924.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    313.,  314.,
      315.,  316.,  317.,  318.,  319.,  320.,  321.,  322.,  323.,  324.,
      987.,  990.,  993.,  996.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    337.,  338.,  339.,  340.,  341.,  342.,  343.,  344.,
      345.,  346.,  347.,  348.,  1059., 1062., 1065., 1068., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    1155., 1158., 1161., 1164.,
      1167., 1170., 1173., 1176., 1179., 1182., 1185., 1188., 3609., 3618.,
      3627., 3636.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  9.,  10., 11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  17., 18., 19., 20., 21., 22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28., 29.,
      30., 31., 32., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  33., 34., 35., 36., 37.,
      38., 39., 40., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  41., 42., 43., 44., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{3, 6, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,   0.,   1.,   2.,   3.,  4.,   18.,  0.,   0.,   8.,
      9.,  10.,  11.,  39.,  0.,   0.,   15., 16.,  17.,  18.,  60.,  0.,
      0.,  87.,  90.,  93.,  96.,  306., 0.,  0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   43.,  44.,
      45., 46.,  144., 0.,   0.,   50.,  51., 52.,  53.,  165., 0.,   0.,
      57., 58.,  59.,  60.,  186., 0.,   0.,  213., 216., 219., 222., 684.,
      0.,  0.,   0.,   0.,   0.,   0.,   0.,  0.,   0.,   0.,   0.,   0.,
      0.,  0.,   0.,   0.,   85.,  86.,  87., 88.,  270., 0.,   0.,   92.,
      93., 94.,  95.,  291., 0.,   0.,   99., 100., 101., 102., 312., 0.,
      0.,  339., 342., 345., 348., 1062.};
  const std::array<int, 4> in_shape = {{3, 6, 7, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,
      0., 0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,
      1., 2.,  3.,  0.,  0.,  0.,  0.,  4., 5., 6., 0., 0.,  0.,  0., 0., 0.,
      0., 0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,
      0., 0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0., 7., 8.,  9.,  0., 0., 0.,
      0., 10., 11., 12., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,
      0., 0.,  0.,  0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,
      0., 0.,  0.,  0.,  13., 14., 15., 0., 0., 0., 0., 16., 17., 18.};
  const std::array<int, 4> in_shape = {{3, 6, 7, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,   3.,    4.,
      5.,   6.,   7.,   8.,   33.,  36.,  0.,   0.,   0.,   0.,   15.,   16.,
      17.,  18.,  19.,  20.,  21.,  22.,  75.,  78.,  0.,   0.,   0.,    0.,
      29.,  30.,  31.,  32.,  33.,  34.,  35.,  36.,  117., 120., 0.,    0.,
      0.,   0.,   171., 174., 177., 180., 183., 186., 189., 192., 603.,  612.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   85.,  86.,  87.,   88.,
      89.,  90.,  91.,  92.,  285., 288., 0.,   0.,   0.,   0.,   99.,   100.,
      101., 102., 103., 104., 105., 106., 327., 330., 0.,   0.,   0.,    0.,
      113., 114., 115., 116., 117., 118., 119., 120., 369., 372., 0.,    0.,
      0.,   0.,   423., 426., 429., 432., 435., 438., 441., 444., 1359., 1368.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   169., 170., 171.,  172.,
      173., 174., 175., 176., 537., 540., 0.,   0.,   0.,   0.,   183.,  184.,
      185., 186., 187., 188., 189., 190., 579., 582., 0.,   0.,   0.,    0.,
      197., 198., 199., 200., 201., 202., 203., 204., 621., 624., 0.,    0.,
      0.,   0.,   675., 678., 681., 684., 687., 690., 693., 696., 2115., 2124.};
  const std::array<int, 4> in_shape = {{3, 6, 7, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  1., 2., 3.,  4.,  5.,  6.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  7.,  8., 9., 10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  13., 14.,
      15., 16., 17., 18., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  19., 20., 21.,
      22., 23., 24., 0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  25., 26., 27., 28., 29., 30., 0.,  0.,
      0.,  0.,  0.,  0.,  0., 0., 31., 32., 33., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{3, 6, 7, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    1.,    2.,    3.,    4.,    5.,    6.,
      7.,    8.,    9.,    10.,   11.,   12.,   13.,   14.,   15.,   16.,
      63.,   66.,   69.,   72.,   0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    29.,   30.,   31.,   32.,   33.,   34.,   35.,   36.,
      37.,   38.,   39.,   40.,   41.,   42.,   43.,   44.,   147.,  150.,
      153.,  156.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      57.,   58.,   59.,   60.,   61.,   62.,   63.,   64.,   65.,   66.,
      67.,   68.,   69.,   70.,   71.,   72.,   231.,  234.,  237.,  240.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    339.,  342.,
      345.,  348.,  351.,  354.,  357.,  360.,  363.,  366.,  369.,  372.,
      375.,  378.,  381.,  384.,  1197., 1206., 1215., 1224., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    169.,  170.,  171.,  172.,  173.,  174.,  175.,  176.,
      177.,  178.,  179.,  180.,  181.,  182.,  183.,  184.,  567.,  570.,
      573.,  576.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      197.,  198.,  199.,  200.,  201.,  202.,  203.,  204.,  205.,  206.,
      207.,  208.,  209.,  210.,  211.,  212.,  651.,  654.,  657.,  660.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    225.,  226.,
      227.,  228.,  229.,  230.,  231.,  232.,  233.,  234.,  235.,  236.,
      237.,  238.,  239.,  240.,  735.,  738.,  741.,  744.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    843.,  846.,  849.,  852.,
      855.,  858.,  861.,  864.,  867.,  870.,  873.,  876.,  879.,  882.,
      885.,  888.,  2709., 2718., 2727., 2736., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      337.,  338.,  339.,  340.,  341.,  342.,  343.,  344.,  345.,  346.,
      347.,  348.,  349.,  350.,  351.,  352.,  1071., 1074., 1077., 1080.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    365.,  366.,
      367.,  368.,  369.,  370.,  371.,  372.,  373.,  374.,  375.,  376.,
      377.,  378.,  379.,  380.,  1155., 1158., 1161., 1164., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    393.,  394.,  395.,  396.,
      397.,  398.,  399.,  400.,  401.,  402.,  403.,  404.,  405.,  406.,
      407.,  408.,  1239., 1242., 1245., 1248., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    1347., 1350., 1353., 1356., 1359., 1362.,
      1365., 1368., 1371., 1374., 1377., 1380., 1383., 1386., 1389., 1392.,
      4221., 4230., 4239., 4248.};
  const std::array<int, 4> in_shape = {{3, 6, 7, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,
      8.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  13., 14., 15., 16., 17., 18., 19., 20., 21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28.,
      29., 30., 31., 32., 33., 34., 35., 36., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  37., 38., 39., 40., 41., 42.,
      43., 44., 45., 46., 47., 48., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  49.,
      50., 51., 52., 53., 54., 55., 56., 57., 58., 59., 60., 0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  61., 62., 63.,
      64., 65., 66., 67., 68., 69., 70., 71., 72.};
  const std::array<int, 4> in_shape = {{3, 6, 7, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,   5.,   21.,
      0.,   0.,   9.,   10.,  11.,  12.,  13.,  45.,  0.,   0.,   17.,  18.,
      19.,  20.,  21.,  69.,  0.,   0.,   99.,  102., 105., 108., 111., 351.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   49.,  50.,  51.,  52.,  53.,  165.,
      0.,   0.,   57.,  58.,  59.,  60.,  61.,  189., 0.,   0.,   65.,  66.,
      67.,  68.,  69.,  213., 0.,   0.,   243., 246., 249., 252., 255., 783.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   97.,  98.,  99.,  100., 101., 309.,
      0.,   0.,   105., 106., 107., 108., 109., 333., 0.,   0.,   113., 114.,
      115., 116., 117., 357., 0.,   0.,   387., 390., 393., 396., 399., 1215.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,   10.,  39.,   42.,
      0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,  21.,  22.,  23.,   24.,
      25.,  26.,  87.,  90.,  0.,   0.,   0.,   0.,   33.,  34.,  35.,   36.,
      37.,  38.,  39.,  40.,  41.,  42.,  135., 138., 0.,   0.,   0.,    0.,
      195., 198., 201., 204., 207., 210., 213., 216., 219., 222., 693.,  702.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      97.,  98.,  99.,  100., 101., 102., 103., 104., 105., 106., 327.,  330.,
      0.,   0.,   0.,   0.,   113., 114., 115., 116., 117., 118., 119.,  120.,
      121., 122., 375., 378., 0.,   0.,   0.,   0.,   129., 130., 131.,  132.,
      133., 134., 135., 136., 137., 138., 423., 426., 0.,   0.,   0.,    0.,
      483., 486., 489., 492., 495., 498., 501., 504., 507., 510., 1557., 1566.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      193., 194., 195., 196., 197., 198., 199., 200., 201., 202., 615.,  618.,
      0.,   0.,   0.,   0.,   209., 210., 211., 212., 213., 214., 215.,  216.,
      217., 218., 663., 666., 0.,   0.,   0.,   0.,   225., 226., 227.,  228.,
      229., 230., 231., 232., 233., 234., 711., 714., 0.,   0.,   0.,    0.,
      771., 774., 777., 780., 783., 786., 789., 792., 795., 798., 2421., 2430.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0., 0., 0., 0., 9.,  10., 11., 12., 13., 14., 15., 16.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 17., 18., 19., 20., 21., 22., 23., 24.,
      0., 0., 0., 0., 0., 0., 0., 0., 25., 26., 27., 28., 29., 30., 31., 32.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 33., 34., 35., 36., 37., 38., 39., 40.,
      0., 0., 0., 0., 0., 0., 0., 0., 41., 42., 43., 44., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x6x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    1.,    2.,    3.,    4.,    5.,    6.,    7.,    8.,
      9.,    10.,   11.,   12.,   13.,   14.,   15.,   16.,   17.,   18.,
      19.,   20.,   75.,   78.,   81.,   84.,   0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    33.,   34.,   35.,   36.,   37.,   38.,
      39.,   40.,   41.,   42.,   43.,   44.,   45.,   46.,   47.,   48.,
      49.,   50.,   51.,   52.,   171.,  174.,  177.,  180.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    65.,   66.,   67.,   68.,
      69.,   70.,   71.,   72.,   73.,   74.,   75.,   76.,   77.,   78.,
      79.,   80.,   81.,   82.,   83.,   84.,   267.,  270.,  273.,  276.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    387.,  390.,
      393.,  396.,  399.,  402.,  405.,  408.,  411.,  414.,  417.,  420.,
      423.,  426.,  429.,  432.,  435.,  438.,  441.,  444.,  1377., 1386.,
      1395., 1404., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    193.,  194.,  195.,  196.,  197.,  198.,
      199.,  200.,  201.,  202.,  203.,  204.,  205.,  206.,  207.,  208.,
      209.,  210.,  211.,  212.,  651.,  654.,  657.,  660.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    225.,  226.,  227.,  228.,
      229.,  230.,  231.,  232.,  233.,  234.,  235.,  236.,  237.,  238.,
      239.,  240.,  241.,  242.,  243.,  244.,  747.,  750.,  753.,  756.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    257.,  258.,
      259.,  260.,  261.,  262.,  263.,  264.,  265.,  266.,  267.,  268.,
      269.,  270.,  271.,  272.,  273.,  274.,  275.,  276.,  843.,  846.,
      849.,  852.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      963.,  966.,  969.,  972.,  975.,  978.,  981.,  984.,  987.,  990.,
      993.,  996.,  999.,  1002., 1005., 1008., 1011., 1014., 1017., 1020.,
      3105., 3114., 3123., 3132., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    385.,  386.,  387.,  388.,
      389.,  390.,  391.,  392.,  393.,  394.,  395.,  396.,  397.,  398.,
      399.,  400.,  401.,  402.,  403.,  404.,  1227., 1230., 1233., 1236.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    417.,  418.,
      419.,  420.,  421.,  422.,  423.,  424.,  425.,  426.,  427.,  428.,
      429.,  430.,  431.,  432.,  433.,  434.,  435.,  436.,  1323., 1326.,
      1329., 1332., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      449.,  450.,  451.,  452.,  453.,  454.,  455.,  456.,  457.,  458.,
      459.,  460.,  461.,  462.,  463.,  464.,  465.,  466.,  467.,  468.,
      1419., 1422., 1425., 1428., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    1539., 1542., 1545., 1548., 1551., 1554., 1557., 1560.,
      1563., 1566., 1569., 1572., 1575., 1578., 1581., 1584., 1587., 1590.,
      1593., 1596., 4833., 4842., 4851., 4860.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x6x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,
      7.,  8.,  9.,  10., 11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17., 18., 19., 20.,
      21., 22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  33., 34., 35., 36., 37., 38., 39., 40., 41.,
      42., 43., 44., 45., 46., 47., 48., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  49., 50., 51., 52., 53., 54., 55.,
      56., 57., 58., 59., 60., 61., 62., 63., 64., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  65., 66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76.,
      77., 78., 79., 80., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  81., 82., 83., 84., 85., 86., 87., 88., 89., 90.,
      91., 92., 93., 94., 95., 96.};
  const std::array<int, 4> in_shape = {{3, 6, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,   0.,   0.,   0.,   0., 0., 0.,   0.,   0.,   0.,
      0., 0., 1.,   2.,   3.,   15.,  0., 0., 7.,   8.,   9.,   33.,
      0., 0., 13.,  14.,  15.,  51.,  0., 0., 19.,  20.,  21.,  69.,
      0., 0., 93.,  96.,  99.,  315., 0., 0., 0.,   0.,   0.,   0.,
      0., 0., 0.,   0.,   0.,   0.,   0., 0., 43.,  44.,  45.,  141.,
      0., 0., 49.,  50.,  51.,  159., 0., 0., 55.,  56.,  57.,  177.,
      0., 0., 61.,  62.,  63.,  195., 0., 0., 219., 222., 225., 693.,
      0., 0., 0.,   0.,   0.,   0.,   0., 0., 0.,   0.,   0.,   0.,
      0., 0., 85.,  86.,  87.,  267., 0., 0., 91.,  92.,  93.,  285.,
      0., 0., 97.,  98.,  99.,  303., 0., 0., 103., 104., 105., 321.,
      0., 0., 345., 348., 351., 1071.};
  const std::array<int, 4> in_shape = {{3, 7, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 1.,  2.,  0., 0.,
      0.,  0.,  3.,  4.,  0., 0., 0.,  0.,  5., 6., 0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 7.,  8.,  0., 0., 0., 0., 9.,  10., 0., 0.,
      0.,  0.,  11., 12., 0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0.,
      0.,  0.,  0.,  0.,  0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0.,
      13., 14., 0.,  0.,  0., 0., 15., 16., 0., 0., 0., 0., 17., 18.};
  const std::array<int, 4> in_shape = {{3, 7, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 1.,   2.,   3.,   4.,   5.,   6.,   27.,   30.,
      0., 0., 0., 0., 13.,  14.,  15.,  16.,  17.,  18.,  63.,   66.,
      0., 0., 0., 0., 25.,  26.,  27.,  28.,  29.,  30.,  99.,   102.,
      0., 0., 0., 0., 37.,  38.,  39.,  40.,  41.,  42.,  135.,  138.,
      0., 0., 0., 0., 183., 186., 189., 192., 195., 198., 621.,  630.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 85.,  86.,  87.,  88.,  89.,  90.,  279.,  282.,
      0., 0., 0., 0., 97.,  98.,  99.,  100., 101., 102., 315.,  318.,
      0., 0., 0., 0., 109., 110., 111., 112., 113., 114., 351.,  354.,
      0., 0., 0., 0., 121., 122., 123., 124., 125., 126., 387.,  390.,
      0., 0., 0., 0., 435., 438., 441., 444., 447., 450., 1377., 1386.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 169., 170., 171., 172., 173., 174., 531.,  534.,
      0., 0., 0., 0., 181., 182., 183., 184., 185., 186., 567.,  570.,
      0., 0., 0., 0., 193., 194., 195., 196., 197., 198., 603.,  606.,
      0., 0., 0., 0., 205., 206., 207., 208., 209., 210., 639.,  642.,
      0., 0., 0., 0., 687., 690., 693., 696., 699., 702., 2133., 2142.};
  const std::array<int, 4> in_shape = {{3, 7, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  17., 18., 19., 20., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  25.,
      26., 27., 28., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  29., 30., 31., 32.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  33., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{3, 7, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    1.,    2.,    3.,    4.,
      5.,    6.,    7.,    8.,    9.,    10.,   11.,   12.,   51.,   54.,
      57.,   60.,   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      25.,   26.,   27.,   28.,   29.,   30.,   31.,   32.,   33.,   34.,
      35.,   36.,   123.,  126.,  129.,  132.,  0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    49.,   50.,   51.,   52.,   53.,   54.,
      55.,   56.,   57.,   58.,   59.,   60.,   195.,  198.,  201.,  204.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    73.,   74.,
      75.,   76.,   77.,   78.,   79.,   80.,   81.,   82.,   83.,   84.,
      267.,  270.,  273.,  276.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    363.,  366.,  369.,  372.,  375.,  378.,  381.,  384.,
      387.,  390.,  393.,  396.,  1233., 1242., 1251., 1260., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    169.,  170.,  171.,  172.,  173.,  174.,
      175.,  176.,  177.,  178.,  179.,  180.,  555.,  558.,  561.,  564.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    193.,  194.,
      195.,  196.,  197.,  198.,  199.,  200.,  201.,  202.,  203.,  204.,
      627.,  630.,  633.,  636.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    217.,  218.,  219.,  220.,  221.,  222.,  223.,  224.,
      225.,  226.,  227.,  228.,  699.,  702.,  705.,  708.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    241.,  242.,  243.,  244.,
      245.,  246.,  247.,  248.,  249.,  250.,  251.,  252.,  771.,  774.,
      777.,  780.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      867.,  870.,  873.,  876.,  879.,  882.,  885.,  888.,  891.,  894.,
      897.,  900.,  2745., 2754., 2763., 2772., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    337.,  338.,  339.,  340.,  341.,  342.,  343.,  344.,
      345.,  346.,  347.,  348.,  1059., 1062., 1065., 1068., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    361.,  362.,  363.,  364.,
      365.,  366.,  367.,  368.,  369.,  370.,  371.,  372.,  1131., 1134.,
      1137., 1140., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      385.,  386.,  387.,  388.,  389.,  390.,  391.,  392.,  393.,  394.,
      395.,  396.,  1203., 1206., 1209., 1212., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    409.,  410.,  411.,  412.,  413.,  414.,
      415.,  416.,  417.,  418.,  419.,  420.,  1275., 1278., 1281., 1284.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1371., 1374.,
      1377., 1380., 1383., 1386., 1389., 1392., 1395., 1398., 1401., 1404.,
      4257., 4266., 4275., 4284.};
  const std::array<int, 4> in_shape = {{3, 7, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  9.,  10., 11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17., 18., 19., 20., 21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28., 29.,
      30., 31., 32., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  33., 34., 35., 36., 37., 38., 39., 40., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  41., 42.,
      43., 44., 45., 46., 47., 48., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  49., 50.,
      51., 52., 53., 54., 55., 56., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  57., 58., 59., 60., 61., 62., 63., 64.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  65., 66., 67., 68., 69., 70., 71., 72.};
  const std::array<int, 4> in_shape = {{3, 7, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,   18.,  0.,   0.,   8.,
      9.,   10.,  11.,  39.,  0.,   0.,   15.,  16.,  17.,  18.,  60.,  0.,
      0.,   22.,  23.,  24.,  25.,  81.,  0.,   0.,   108., 111., 114., 117.,
      369., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   50.,  51.,  52.,  53.,  165., 0.,   0.,
      57.,  58.,  59.,  60.,  186., 0.,   0.,   64.,  65.,  66.,  67.,  207.,
      0.,   0.,   71.,  72.,  73.,  74.,  228., 0.,   0.,   255., 258., 261.,
      264., 810., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   99.,  100., 101., 102., 312., 0.,
      0.,   106., 107., 108., 109., 333., 0.,   0.,   113., 114., 115., 116.,
      354., 0.,   0.,   120., 121., 122., 123., 375., 0.,   0.,   402., 405.,
      408., 411., 1251.};
  const std::array<int, 4> in_shape = {{3, 7, 7, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0., 1.,  2.,  3.,  0.,  0.,  0.,  0.,  4.,  5.,  6.,  0.,  0.,  0.,
      0.,  7., 8.,  9.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0., 0.,  0.,  0.,  0.,  10., 11., 12., 0.,  0.,  0.,  0.,  13., 14.,
      15., 0., 0.,  0.,  0.,  16., 17., 18., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  19., 20., 21., 0.,  0.,
      0.,  0., 22., 23., 24., 0.,  0.,  0.,  0.,  25., 26., 27.};
  const std::array<int, 4> in_shape = {{3, 7, 7, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   1.,   2.,   3.,   4.,
      5.,   6.,   7.,    8.,    33.,   36.,  0.,   0.,   0.,   0.,   15.,  16.,
      17.,  18.,  19.,   20.,   21.,   22.,  75.,  78.,  0.,   0.,   0.,   0.,
      29.,  30.,  31.,   32.,   33.,   34.,  35.,  36.,  117., 120., 0.,   0.,
      0.,   0.,   43.,   44.,   45.,   46.,  47.,  48.,  49.,  50.,  159., 162.,
      0.,   0.,   0.,    0.,    213.,  216., 219., 222., 225., 228., 231., 234.,
      729., 738., 0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   99.,  100.,
      101., 102., 103.,  104.,  105.,  106., 327., 330., 0.,   0.,   0.,   0.,
      113., 114., 115.,  116.,  117.,  118., 119., 120., 369., 372., 0.,   0.,
      0.,   0.,   127.,  128.,  129.,  130., 131., 132., 133., 134., 411., 414.,
      0.,   0.,   0.,    0.,    141.,  142., 143., 144., 145., 146., 147., 148.,
      453., 456., 0.,    0.,    0.,    0.,   507., 510., 513., 516., 519., 522.,
      525., 528., 1611., 1620., 0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,   0.,
      197., 198., 199.,  200.,  201.,  202., 203., 204., 621., 624., 0.,   0.,
      0.,   0.,   211.,  212.,  213.,  214., 215., 216., 217., 218., 663., 666.,
      0.,   0.,   0.,    0.,    225.,  226., 227., 228., 229., 230., 231., 232.,
      705., 708., 0.,    0.,    0.,    0.,   239., 240., 241., 242., 243., 244.,
      245., 246., 747.,  750.,  0.,    0.,   0.,   0.,   801., 804., 807., 810.,
      813., 816., 819.,  822.,  2493., 2502.};
  const std::array<int, 4> in_shape = {{3, 7, 7, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  7.,  8.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  13., 14., 15., 16., 17., 18., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  19., 20., 21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28.,
      29., 30., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  31., 32., 33., 34., 35.,
      36., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  37., 38., 39., 40., 41., 42., 0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  43., 44., 45., 46., 47., 48., 0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  49., 50., 51., 52., 53., 54.};
  const std::array<int, 4> in_shape = {{3, 7, 7, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    1.,    2.,    3.,    4.,    5.,    6.,
      7.,    8.,    9.,    10.,   11.,   12.,   13.,   14.,   15.,   16.,
      63.,   66.,   69.,   72.,   0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    29.,   30.,   31.,   32.,   33.,   34.,   35.,   36.,
      37.,   38.,   39.,   40.,   41.,   42.,   43.,   44.,   147.,  150.,
      153.,  156.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      57.,   58.,   59.,   60.,   61.,   62.,   63.,   64.,   65.,   66.,
      67.,   68.,   69.,   70.,   71.,   72.,   231.,  234.,  237.,  240.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    85.,   86.,
      87.,   88.,   89.,   90.,   91.,   92.,   93.,   94.,   95.,   96.,
      97.,   98.,   99.,   100.,  315.,  318.,  321.,  324.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    423.,  426.,  429.,  432.,
      435.,  438.,  441.,  444.,  447.,  450.,  453.,  456.,  459.,  462.,
      465.,  468.,  1449., 1458., 1467., 1476., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      197.,  198.,  199.,  200.,  201.,  202.,  203.,  204.,  205.,  206.,
      207.,  208.,  209.,  210.,  211.,  212.,  651.,  654.,  657.,  660.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    225.,  226.,
      227.,  228.,  229.,  230.,  231.,  232.,  233.,  234.,  235.,  236.,
      237.,  238.,  239.,  240.,  735.,  738.,  741.,  744.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    253.,  254.,  255.,  256.,
      257.,  258.,  259.,  260.,  261.,  262.,  263.,  264.,  265.,  266.,
      267.,  268.,  819.,  822.,  825.,  828.,  0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    281.,  282.,  283.,  284.,  285.,  286.,
      287.,  288.,  289.,  290.,  291.,  292.,  293.,  294.,  295.,  296.,
      903.,  906.,  909.,  912.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    1011., 1014., 1017., 1020., 1023., 1026., 1029., 1032.,
      1035., 1038., 1041., 1044., 1047., 1050., 1053., 1056., 3213., 3222.,
      3231., 3240., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    393.,  394.,  395.,  396.,
      397.,  398.,  399.,  400.,  401.,  402.,  403.,  404.,  405.,  406.,
      407.,  408.,  1239., 1242., 1245., 1248., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    421.,  422.,  423.,  424.,  425.,  426.,
      427.,  428.,  429.,  430.,  431.,  432.,  433.,  434.,  435.,  436.,
      1323., 1326., 1329., 1332., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    449.,  450.,  451.,  452.,  453.,  454.,  455.,  456.,
      457.,  458.,  459.,  460.,  461.,  462.,  463.,  464.,  1407., 1410.,
      1413., 1416., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      477.,  478.,  479.,  480.,  481.,  482.,  483.,  484.,  485.,  486.,
      487.,  488.,  489.,  490.,  491.,  492.,  1491., 1494., 1497., 1500.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1599., 1602.,
      1605., 1608., 1611., 1614., 1617., 1620., 1623., 1626., 1629., 1632.,
      1635., 1638., 1641., 1644., 4977., 4986., 4995., 5004.};
  const std::array<int, 4> in_shape = {{3, 7, 7, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   1.,   2.,
      3.,   4.,   5.,  6.,  7.,  8.,  9.,  10.,  11.,  12.,  0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      13.,  14.,  15., 16., 17., 18., 19., 20.,  21.,  22.,  23.,  24.,  0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   25., 26., 27., 28., 29., 30.,  31.,  32.,  33.,  34.,  35.,
      36.,  0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   37.,
      38.,  39.,  40., 41., 42., 43., 44., 45.,  46.,  47.,  48.,  0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   49.,  50., 51., 52., 53., 54., 55.,  56.,  57.,  58.,  59.,  60.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  61., 62., 63., 64., 65.,  66.,  67.,  68.,  69.,  70.,
      71.,  72.,  0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      73.,  74.,  75., 76., 77., 78., 79., 80.,  81.,  82.,  83.,  84.,  0.,
      0.,   0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   85., 86., 87., 88., 89., 90.,  91.,  92.,  93.,  94.,  95.,
      96.,  0.,   0.,  0.,  0.,  0.,  0.,  0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,  0.,  97., 98., 99., 100., 101., 102., 103., 104., 105.,
      106., 107., 108.};
  const std::array<int, 4> in_shape = {{3, 7, 7, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,   5.,   21.,
      0.,   0.,   9.,   10.,  11.,  12.,  13.,  45.,  0.,   0.,   17.,  18.,
      19.,  20.,  21.,  69.,  0.,   0.,   25.,  26.,  27.,  28.,  29.,  93.,
      0.,   0.,   123., 126., 129., 132., 135., 423., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   57.,  58.,  59.,  60.,  61.,  189., 0.,   0.,   65.,  66.,
      67.,  68.,  69.,  213., 0.,   0.,   73.,  74.,  75.,  76.,  77.,  237.,
      0.,   0.,   81.,  82.,  83.,  84.,  85.,  261., 0.,   0.,   291., 294.,
      297., 300., 303., 927., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   113., 114.,
      115., 116., 117., 357., 0.,   0.,   121., 122., 123., 124., 125., 381.,
      0.,   0.,   129., 130., 131., 132., 133., 405., 0.,   0.,   137., 138.,
      139., 140., 141., 429., 0.,   0.,   459., 462., 465., 468., 471., 1431.};
  const std::array<int, 4> in_shape = {{3, 7, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 25., 26., 27., 28., 0., 0., 0., 0., 29., 30., 31., 32.,
      0., 0., 0., 0., 33., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{3, 7, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    1.,    2.,    3.,   4.,   5.,   6.,   7.,   8.,
      9.,   10.,  39.,   42.,   0.,    0.,   0.,   0.,   17.,  18.,  19.,
      20.,  21.,  22.,   23.,   24.,   25.,  26.,  87.,  90.,  0.,   0.,
      0.,   0.,   33.,   34.,   35.,   36.,  37.,  38.,  39.,  40.,  41.,
      42.,  135., 138.,  0.,    0.,    0.,   0.,   49.,  50.,  51.,  52.,
      53.,  54.,  55.,   56.,   57.,   58.,  183., 186., 0.,   0.,   0.,
      0.,   243., 246.,  249.,  252.,  255., 258., 261., 264., 267., 270.,
      837., 846., 0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    113., 114., 115., 116., 117., 118.,
      119., 120., 121.,  122.,  375.,  378., 0.,   0.,   0.,   0.,   129.,
      130., 131., 132.,  133.,  134.,  135., 136., 137., 138., 423., 426.,
      0.,   0.,   0.,    0.,    145.,  146., 147., 148., 149., 150., 151.,
      152., 153., 154.,  471.,  474.,  0.,   0.,   0.,   0.,   161., 162.,
      163., 164., 165.,  166.,  167.,  168., 169., 170., 519., 522., 0.,
      0.,   0.,   0.,    579.,  582.,  585., 588., 591., 594., 597., 600.,
      603., 606., 1845., 1854., 0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   225., 226., 227., 228.,
      229., 230., 231.,  232.,  233.,  234., 711., 714., 0.,   0.,   0.,
      0.,   241., 242.,  243.,  244.,  245., 246., 247., 248., 249., 250.,
      759., 762., 0.,    0.,    0.,    0.,   257., 258., 259., 260., 261.,
      262., 263., 264.,  265.,  266.,  807., 810., 0.,   0.,   0.,   0.,
      273., 274., 275.,  276.,  277.,  278., 279., 280., 281., 282., 855.,
      858., 0.,   0.,    0.,    0.,    915., 918., 921., 924., 927., 930.,
      933., 936., 939.,  942.,  2853., 2862.};
  const std::array<int, 4> in_shape = {{3, 7, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0., 0., 0., 0., 9.,  10., 11., 12., 13., 14., 15., 16.,
      0., 0., 0., 0., 0., 0., 0., 0., 17., 18., 19., 20., 21., 22., 23., 24.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 25., 26., 27., 28., 29., 30., 31., 32.,
      0., 0., 0., 0., 0., 0., 0., 0., 33., 34., 35., 36., 37., 38., 39., 40.,
      0., 0., 0., 0., 0., 0., 0., 0., 41., 42., 43., 44., 45., 46., 47., 48.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 49., 50., 51., 52., 53., 54., 55., 56.,
      0., 0., 0., 0., 0., 0., 0., 0., 57., 58., 59., 60., 61., 62., 63., 64.,
      0., 0., 0., 0., 0., 0., 0., 0., 65., 66., 67., 68., 69., 70., 71., 72.};
  const std::array<int, 4> in_shape = {{3, 7, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x7x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    1.,    2.,    3.,    4.,    5.,    6.,    7.,    8.,
      9.,    10.,   11.,   12.,   13.,   14.,   15.,   16.,   17.,   18.,
      19.,   20.,   75.,   78.,   81.,   84.,   0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    33.,   34.,   35.,   36.,   37.,   38.,
      39.,   40.,   41.,   42.,   43.,   44.,   45.,   46.,   47.,   48.,
      49.,   50.,   51.,   52.,   171.,  174.,  177.,  180.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    65.,   66.,   67.,   68.,
      69.,   70.,   71.,   72.,   73.,   74.,   75.,   76.,   77.,   78.,
      79.,   80.,   81.,   82.,   83.,   84.,   267.,  270.,  273.,  276.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    97.,   98.,
      99.,   100.,  101.,  102.,  103.,  104.,  105.,  106.,  107.,  108.,
      109.,  110.,  111.,  112.,  113.,  114.,  115.,  116.,  363.,  366.,
      369.,  372.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      483.,  486.,  489.,  492.,  495.,  498.,  501.,  504.,  507.,  510.,
      513.,  516.,  519.,  522.,  525.,  528.,  531.,  534.,  537.,  540.,
      1665., 1674., 1683., 1692., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    225.,  226.,  227.,  228.,
      229.,  230.,  231.,  232.,  233.,  234.,  235.,  236.,  237.,  238.,
      239.,  240.,  241.,  242.,  243.,  244.,  747.,  750.,  753.,  756.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    257.,  258.,
      259.,  260.,  261.,  262.,  263.,  264.,  265.,  266.,  267.,  268.,
      269.,  270.,  271.,  272.,  273.,  274.,  275.,  276.,  843.,  846.,
      849.,  852.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      289.,  290.,  291.,  292.,  293.,  294.,  295.,  296.,  297.,  298.,
      299.,  300.,  301.,  302.,  303.,  304.,  305.,  306.,  307.,  308.,
      939.,  942.,  945.,  948.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    321.,  322.,  323.,  324.,  325.,  326.,  327.,  328.,
      329.,  330.,  331.,  332.,  333.,  334.,  335.,  336.,  337.,  338.,
      339.,  340.,  1035., 1038., 1041., 1044., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    1155., 1158., 1161., 1164., 1167., 1170.,
      1173., 1176., 1179., 1182., 1185., 1188., 1191., 1194., 1197., 1200.,
      1203., 1206., 1209., 1212., 3681., 3690., 3699., 3708., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      449.,  450.,  451.,  452.,  453.,  454.,  455.,  456.,  457.,  458.,
      459.,  460.,  461.,  462.,  463.,  464.,  465.,  466.,  467.,  468.,
      1419., 1422., 1425., 1428., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    481.,  482.,  483.,  484.,  485.,  486.,  487.,  488.,
      489.,  490.,  491.,  492.,  493.,  494.,  495.,  496.,  497.,  498.,
      499.,  500.,  1515., 1518., 1521., 1524., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    513.,  514.,  515.,  516.,  517.,  518.,
      519.,  520.,  521.,  522.,  523.,  524.,  525.,  526.,  527.,  528.,
      529.,  530.,  531.,  532.,  1611., 1614., 1617., 1620., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    545.,  546.,  547.,  548.,
      549.,  550.,  551.,  552.,  553.,  554.,  555.,  556.,  557.,  558.,
      559.,  560.,  561.,  562.,  563.,  564.,  1707., 1710., 1713., 1716.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1827., 1830.,
      1833., 1836., 1839., 1842., 1845., 1848., 1851., 1854., 1857., 1860.,
      1863., 1866., 1869., 1872., 1875., 1878., 1881., 1884., 5697., 5706.,
      5715., 5724.};
  const std::array<int, 4> in_shape = {{3, 7, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x7x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,   10.,  11.,  12.,
      13.,  14.,  15.,  16.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,
      21.,  22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   33.,  34.,  35.,  36.,  37.,  38.,  39.,  40.,
      41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   49.,  50.,  51.,  52.,
      53.,  54.,  55.,  56.,  57.,  58.,  59.,  60.,  61.,  62.,  63.,  64.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   65.,  66.,  67.,  68.,  69.,  70.,  71.,  72.,
      73.,  74.,  75.,  76.,  77.,  78.,  79.,  80.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      81.,  82.,  83.,  84.,  85.,  86.,  87.,  88.,  89.,  90.,  91.,  92.,
      93.,  94.,  95.,  96.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   97.,  98.,  99.,  100., 101., 102., 103., 104.,
      105., 106., 107., 108., 109., 110., 111., 112., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      113., 114., 115., 116., 117., 118., 119., 120., 121., 122., 123., 124.,
      125., 126., 127., 128., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   129., 130., 131., 132.,
      133., 134., 135., 136., 137., 138., 139., 140., 141., 142., 143., 144.};
  const std::array<int, 4> in_shape = {{3, 7, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,   0.,   0.,   0.,   0., 0., 0.,   0.,   0.,   0.,
      0., 0., 1.,   2.,   3.,   15.,  0., 0., 7.,   8.,   9.,   33.,
      0., 0., 13.,  14.,  15.,  51.,  0., 0., 19.,  20.,  21.,  69.,
      0., 0., 25.,  26.,  27.,  87.,  0., 0., 111., 114., 117., 369.,
      0., 0., 0.,   0.,   0.,   0.,   0., 0., 0.,   0.,   0.,   0.,
      0., 0., 49.,  50.,  51.,  159., 0., 0., 55.,  56.,  57.,  177.,
      0., 0., 61.,  62.,  63.,  195., 0., 0., 67.,  68.,  69.,  213.,
      0., 0., 73.,  74.,  75.,  231., 0., 0., 255., 258., 261., 801.,
      0., 0., 0.,   0.,   0.,   0.,   0., 0., 0.,   0.,   0.,   0.,
      0., 0., 97.,  98.,  99.,  303., 0., 0., 103., 104., 105., 321.,
      0., 0., 109., 110., 111., 339., 0., 0., 115., 116., 117., 357.,
      0., 0., 121., 122., 123., 375., 0., 0., 399., 402., 405., 1233.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x6x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 1.,  2.,  0.,  0.,
      0., 0., 3.,  4.,  0., 0., 0., 0., 5.,  6.,  0., 0., 0.,  0.,  7.,  8.,
      0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 9.,  10., 0.,  0.,
      0., 0., 11., 12., 0., 0., 0., 0., 13., 14., 0., 0., 0.,  0.,  15., 16.,
      0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0.,  0.,  0., 0., 0., 0., 0.,  0.,  0., 0., 17., 18., 0.,  0.,
      0., 0., 19., 20., 0., 0., 0., 0., 21., 22., 0., 0., 0.,  0.,  23., 24.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 1.,   2.,   3.,   4.,   5.,   6.,   27.,   30.,
      0., 0., 0., 0., 13.,  14.,  15.,  16.,  17.,  18.,  63.,   66.,
      0., 0., 0., 0., 25.,  26.,  27.,  28.,  29.,  30.,  99.,   102.,
      0., 0., 0., 0., 37.,  38.,  39.,  40.,  41.,  42.,  135.,  138.,
      0., 0., 0., 0., 49.,  50.,  51.,  52.,  53.,  54.,  171.,  174.,
      0., 0., 0., 0., 219., 222., 225., 228., 231., 234., 729.,  738.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 97.,  98.,  99.,  100., 101., 102., 315.,  318.,
      0., 0., 0., 0., 109., 110., 111., 112., 113., 114., 351.,  354.,
      0., 0., 0., 0., 121., 122., 123., 124., 125., 126., 387.,  390.,
      0., 0., 0., 0., 133., 134., 135., 136., 137., 138., 423.,  426.,
      0., 0., 0., 0., 145., 146., 147., 148., 149., 150., 459.,  462.,
      0., 0., 0., 0., 507., 510., 513., 516., 519., 522., 1593., 1602.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,
      0., 0., 0., 0., 193., 194., 195., 196., 197., 198., 603.,  606.,
      0., 0., 0., 0., 205., 206., 207., 208., 209., 210., 639.,  642.,
      0., 0., 0., 0., 217., 218., 219., 220., 221., 222., 675.,  678.,
      0., 0., 0., 0., 229., 230., 231., 232., 233., 234., 711.,  714.,
      0., 0., 0., 0., 241., 242., 243., 244., 245., 246., 747.,  750.,
      0., 0., 0., 0., 795., 798., 801., 804., 807., 810., 2457., 2466.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x6x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  5.,  6.,  7.,  8.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  17., 18., 19., 20., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  29., 30., 31., 32., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  33., 34., 35., 36., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  37., 38., 39., 40., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  41., 42., 43., 44., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  45.,
      46., 47., 48.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    1.,    2.,    3.,    4.,
      5.,    6.,    7.,    8.,    9.,    10.,   11.,   12.,   51.,   54.,
      57.,   60.,   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      25.,   26.,   27.,   28.,   29.,   30.,   31.,   32.,   33.,   34.,
      35.,   36.,   123.,  126.,  129.,  132.,  0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    49.,   50.,   51.,   52.,   53.,   54.,
      55.,   56.,   57.,   58.,   59.,   60.,   195.,  198.,  201.,  204.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    73.,   74.,
      75.,   76.,   77.,   78.,   79.,   80.,   81.,   82.,   83.,   84.,
      267.,  270.,  273.,  276.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    97.,   98.,   99.,   100.,  101.,  102.,  103.,  104.,
      105.,  106.,  107.,  108.,  339.,  342.,  345.,  348.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    435.,  438.,  441.,  444.,
      447.,  450.,  453.,  456.,  459.,  462.,  465.,  468.,  1449., 1458.,
      1467., 1476., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    193.,  194.,
      195.,  196.,  197.,  198.,  199.,  200.,  201.,  202.,  203.,  204.,
      627.,  630.,  633.,  636.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    217.,  218.,  219.,  220.,  221.,  222.,  223.,  224.,
      225.,  226.,  227.,  228.,  699.,  702.,  705.,  708.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    241.,  242.,  243.,  244.,
      245.,  246.,  247.,  248.,  249.,  250.,  251.,  252.,  771.,  774.,
      777.,  780.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      265.,  266.,  267.,  268.,  269.,  270.,  271.,  272.,  273.,  274.,
      275.,  276.,  843.,  846.,  849.,  852.,  0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    289.,  290.,  291.,  292.,  293.,  294.,
      295.,  296.,  297.,  298.,  299.,  300.,  915.,  918.,  921.,  924.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1011., 1014.,
      1017., 1020., 1023., 1026., 1029., 1032., 1035., 1038., 1041., 1044.,
      3177., 3186., 3195., 3204., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      385.,  386.,  387.,  388.,  389.,  390.,  391.,  392.,  393.,  394.,
      395.,  396.,  1203., 1206., 1209., 1212., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    409.,  410.,  411.,  412.,  413.,  414.,
      415.,  416.,  417.,  418.,  419.,  420.,  1275., 1278., 1281., 1284.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    433.,  434.,
      435.,  436.,  437.,  438.,  439.,  440.,  441.,  442.,  443.,  444.,
      1347., 1350., 1353., 1356., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    457.,  458.,  459.,  460.,  461.,  462.,  463.,  464.,
      465.,  466.,  467.,  468.,  1419., 1422., 1425., 1428., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    481.,  482.,  483.,  484.,
      485.,  486.,  487.,  488.,  489.,  490.,  491.,  492.,  1491., 1494.,
      1497., 1500., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      1587., 1590., 1593., 1596., 1599., 1602., 1605., 1608., 1611., 1614.,
      1617., 1620., 4905., 4914., 4923., 4932.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x6x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  9.,  10., 11., 12., 13., 14., 15., 16., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  17., 18., 19., 20., 21.,
      22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  25., 26., 27., 28., 29., 30., 31., 32., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  33., 34., 35., 36., 37., 38., 39., 40., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  41., 42.,
      43., 44., 45., 46., 47., 48., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  49., 50., 51., 52., 53., 54., 55., 56.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  57., 58., 59., 60., 61., 62., 63., 64., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  65., 66., 67., 68., 69., 70., 71., 72., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  73., 74., 75., 76., 77.,
      78., 79., 80., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  81., 82., 83., 84., 85., 86., 87., 88., 0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  89., 90.,
      91., 92., 93., 94., 95., 96.};
  const std::array<int, 4> in_shape = {{3, 8, 6, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,   18.,  0.,   0.,   8.,
      9.,   10.,  11.,  39.,  0.,   0.,   15.,  16.,  17.,  18.,  60.,  0.,
      0.,   22.,  23.,  24.,  25.,  81.,  0.,   0.,   29.,  30.,  31.,  32.,
      102., 0.,   0.,   129., 132., 135., 138., 432., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      57.,  58.,  59.,  60.,  186., 0.,   0.,   64.,  65.,  66.,  67.,  207.,
      0.,   0.,   71.,  72.,  73.,  74.,  228., 0.,   0.,   78.,  79.,  80.,
      81.,  249., 0.,   0.,   85.,  86.,  87.,  88.,  270., 0.,   0.,   297.,
      300., 303., 306., 936., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   113., 114., 115., 116.,
      354., 0.,   0.,   120., 121., 122., 123., 375., 0.,   0.,   127., 128.,
      129., 130., 396., 0.,   0.,   134., 135., 136., 137., 417., 0.,   0.,
      141., 142., 143., 144., 438., 0.,   0.,   465., 468., 471., 474., 1440.};
  const std::array<int, 4> in_shape = {{3, 8, 7, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x7x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  3.,  0., 0., 0., 0., 4.,  5.,  6.,
      0., 0., 0., 0., 7.,  8.,  9.,  0., 0., 0., 0., 10., 11., 12.,
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 13., 14., 15., 0., 0., 0., 0., 16., 17., 18.,
      0., 0., 0., 0., 19., 20., 21., 0., 0., 0., 0., 22., 23., 24.,
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,
      0., 0., 0., 0., 25., 26., 27., 0., 0., 0., 0., 28., 29., 30.,
      0., 0., 0., 0., 31., 32., 33., 0., 0., 0., 0., 34., 35., 36.};
  const std::array<int, 4> in_shape = {{3, 8, 7, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   1.,
      2.,   3.,   4.,    5.,    6.,    7.,   8.,   33.,  36.,  0.,   0.,
      0.,   0.,   15.,   16.,   17.,   18.,  19.,  20.,  21.,  22.,  75.,
      78.,  0.,   0.,    0.,    0.,    29.,  30.,  31.,  32.,  33.,  34.,
      35.,  36.,  117.,  120.,  0.,    0.,   0.,   0.,   43.,  44.,  45.,
      46.,  47.,  48.,   49.,   50.,   159., 162., 0.,   0.,   0.,   0.,
      57.,  58.,  59.,   60.,   61.,   62.,  63.,  64.,  201., 204., 0.,
      0.,   0.,   0.,    255.,  258.,  261., 264., 267., 270., 273., 276.,
      855., 864., 0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   113., 114.,  115.,  116.,  117., 118., 119., 120., 369., 372.,
      0.,   0.,   0.,    0.,    127.,  128., 129., 130., 131., 132., 133.,
      134., 411., 414.,  0.,    0.,    0.,   0.,   141., 142., 143., 144.,
      145., 146., 147.,  148.,  453.,  456., 0.,   0.,   0.,   0.,   155.,
      156., 157., 158.,  159.,  160.,  161., 162., 495., 498., 0.,   0.,
      0.,   0.,   169.,  170.,  171.,  172., 173., 174., 175., 176., 537.,
      540., 0.,   0.,    0.,    0.,    591., 594., 597., 600., 603., 606.,
      609., 612., 1863., 1872., 0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    0.,    0.,    0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,    225.,  226.,  227., 228., 229., 230., 231., 232.,
      705., 708., 0.,    0.,    0.,    0.,   239., 240., 241., 242., 243.,
      244., 245., 246.,  747.,  750.,  0.,   0.,   0.,   0.,   253., 254.,
      255., 256., 257.,  258.,  259.,  260., 789., 792., 0.,   0.,   0.,
      0.,   267., 268.,  269.,  270.,  271., 272., 273., 274., 831., 834.,
      0.,   0.,   0.,    0.,    281.,  282., 283., 284., 285., 286., 287.,
      288., 873., 876.,  0.,    0.,    0.,   0.,   927., 930., 933., 936.,
      939., 942., 945.,  948.,  2871., 2880.};
  const std::array<int, 4> in_shape = {{3, 8, 7, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x7x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  7.,  8.,  9.,  10., 11., 12., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  13., 14., 15., 16., 17., 18., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  19., 20., 21., 22., 23., 24., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  25., 26., 27., 28.,
      29., 30., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  31., 32., 33., 34., 35.,
      36., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  37., 38., 39., 40., 41., 42.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  43., 44., 45., 46., 47., 48., 0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  0.,  49., 50., 51., 52., 53., 54., 0.,  0.,  0.,  0.,  0.,  0.,
      0.,  0.,  55., 56., 57., 58., 59., 60., 0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0.,  61., 62., 63., 64., 65., 66., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      67., 68., 69., 70., 71., 72.};
  const std::array<int, 4> in_shape = {{3, 8, 7, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    1.,    2.,    3.,    4.,    5.,    6.,
      7.,    8.,    9.,    10.,   11.,   12.,   13.,   14.,   15.,   16.,
      63.,   66.,   69.,   72.,   0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    29.,   30.,   31.,   32.,   33.,   34.,   35.,   36.,
      37.,   38.,   39.,   40.,   41.,   42.,   43.,   44.,   147.,  150.,
      153.,  156.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      57.,   58.,   59.,   60.,   61.,   62.,   63.,   64.,   65.,   66.,
      67.,   68.,   69.,   70.,   71.,   72.,   231.,  234.,  237.,  240.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    85.,   86.,
      87.,   88.,   89.,   90.,   91.,   92.,   93.,   94.,   95.,   96.,
      97.,   98.,   99.,   100.,  315.,  318.,  321.,  324.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    113.,  114.,  115.,  116.,
      117.,  118.,  119.,  120.,  121.,  122.,  123.,  124.,  125.,  126.,
      127.,  128.,  399.,  402.,  405.,  408.,  0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    507.,  510.,  513.,  516.,  519.,  522.,
      525.,  528.,  531.,  534.,  537.,  540.,  543.,  546.,  549.,  552.,
      1701., 1710., 1719., 1728., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    225.,  226.,
      227.,  228.,  229.,  230.,  231.,  232.,  233.,  234.,  235.,  236.,
      237.,  238.,  239.,  240.,  735.,  738.,  741.,  744.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    253.,  254.,  255.,  256.,
      257.,  258.,  259.,  260.,  261.,  262.,  263.,  264.,  265.,  266.,
      267.,  268.,  819.,  822.,  825.,  828.,  0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    281.,  282.,  283.,  284.,  285.,  286.,
      287.,  288.,  289.,  290.,  291.,  292.,  293.,  294.,  295.,  296.,
      903.,  906.,  909.,  912.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    309.,  310.,  311.,  312.,  313.,  314.,  315.,  316.,
      317.,  318.,  319.,  320.,  321.,  322.,  323.,  324.,  987.,  990.,
      993.,  996.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      337.,  338.,  339.,  340.,  341.,  342.,  343.,  344.,  345.,  346.,
      347.,  348.,  349.,  350.,  351.,  352.,  1071., 1074., 1077., 1080.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1179., 1182.,
      1185., 1188., 1191., 1194., 1197., 1200., 1203., 1206., 1209., 1212.,
      1215., 1218., 1221., 1224., 3717., 3726., 3735., 3744., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    449.,  450.,  451.,  452.,  453.,  454.,  455.,  456.,
      457.,  458.,  459.,  460.,  461.,  462.,  463.,  464.,  1407., 1410.,
      1413., 1416., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      477.,  478.,  479.,  480.,  481.,  482.,  483.,  484.,  485.,  486.,
      487.,  488.,  489.,  490.,  491.,  492.,  1491., 1494., 1497., 1500.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    505.,  506.,
      507.,  508.,  509.,  510.,  511.,  512.,  513.,  514.,  515.,  516.,
      517.,  518.,  519.,  520.,  1575., 1578., 1581., 1584., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    533.,  534.,  535.,  536.,
      537.,  538.,  539.,  540.,  541.,  542.,  543.,  544.,  545.,  546.,
      547.,  548.,  1659., 1662., 1665., 1668., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    561.,  562.,  563.,  564.,  565.,  566.,
      567.,  568.,  569.,  570.,  571.,  572.,  573.,  574.,  575.,  576.,
      1743., 1746., 1749., 1752., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    1851., 1854., 1857., 1860., 1863., 1866., 1869., 1872.,
      1875., 1878., 1881., 1884., 1887., 1890., 1893., 1896., 5733., 5742.,
      5751., 5760.};
  const std::array<int, 4> in_shape = {{3, 8, 7, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x7x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,   3.,   4.,
      5.,   6.,   7.,   8.,   9.,   10.,  11.,  12.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,  22.,  23.,  24.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,
      33.,  34.,  35.,  36.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   37.,  38.,  39.,  40.,
      41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   49.,  50.,  51.,  52.,  53.,  54.,  55.,  56.,
      57.,  58.,  59.,  60.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   61.,  62.,  63.,  64.,
      65.,  66.,  67.,  68.,  69.,  70.,  71.,  72.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      73.,  74.,  75.,  76.,  77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   85.,  86.,  87.,  88.,  89.,  90.,  91.,  92.,
      93.,  94.,  95.,  96.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      97.,  98.,  99.,  100., 101., 102., 103., 104., 105., 106., 107., 108.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   109., 110., 111., 112., 113., 114., 115., 116.,
      117., 118., 119., 120., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   121., 122., 123., 124.,
      125., 126., 127., 128., 129., 130., 131., 132., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      133., 134., 135., 136., 137., 138., 139., 140., 141., 142., 143., 144.};
  const std::array<int, 4> in_shape = {{3, 8, 7, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   1.,   2.,    3.,   4.,   5.,   21.,
      0.,   0.,   9.,   10.,  11.,  12.,  13.,  45.,   0.,   0.,   17.,  18.,
      19.,  20.,  21.,  69.,  0.,   0.,   25.,  26.,   27.,  28.,  29.,  93.,
      0.,   0.,   33.,  34.,  35.,  36.,  37.,  117.,  0.,   0.,   147., 150.,
      153., 156., 159., 495., 0.,   0.,   0.,   0.,    0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,   0.,   65.,  66.,
      67.,  68.,  69.,  213., 0.,   0.,   73.,  74.,   75.,  76.,  77.,  237.,
      0.,   0.,   81.,  82.,  83.,  84.,  85.,  261.,  0.,   0.,   89.,  90.,
      91.,  92.,  93.,  285., 0.,   0.,   97.,  98.,   99.,  100., 101., 309.,
      0.,   0.,   339., 342., 345., 348., 351., 1071., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,    0.,   0.,   0.,   0.,
      0.,   0.,   129., 130., 131., 132., 133., 405.,  0.,   0.,   137., 138.,
      139., 140., 141., 429., 0.,   0.,   145., 146.,  147., 148., 149., 453.,
      0.,   0.,   153., 154., 155., 156., 157., 477.,  0.,   0.,   161., 162.,
      163., 164., 165., 501., 0.,   0.,   531., 534.,  537., 540., 543., 1647.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 1}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x8x1) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 1.,  2.,  3.,  4.,  0., 0., 0., 0., 5.,  6.,  7.,  8.,
      0., 0., 0., 0., 9.,  10., 11., 12., 0., 0., 0., 0., 13., 14., 15., 16.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 17., 18., 19., 20., 0., 0., 0., 0., 21., 22., 23., 24.,
      0., 0., 0., 0., 25., 26., 27., 28., 0., 0., 0., 0., 29., 30., 31., 32.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0.,  0.,  0.,  0.,  0., 0., 0., 0., 0.,  0.,  0.,  0.,
      0., 0., 0., 0., 33., 34., 35., 36., 0., 0., 0., 0., 37., 38., 39., 40.,
      0., 0., 0., 0., 41., 42., 43., 44., 0., 0., 0., 0., 45., 46., 47., 48.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 1}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    1.,    2.,    3.,    4.,
      5.,    6.,    7.,    8.,    9.,    10.,   39.,   42.,   0.,    0.,
      0.,    0.,    17.,   18.,   19.,   20.,   21.,   22.,   23.,   24.,
      25.,   26.,   87.,   90.,   0.,    0.,    0.,    0.,    33.,   34.,
      35.,   36.,   37.,   38.,   39.,   40.,   41.,   42.,   135.,  138.,
      0.,    0.,    0.,    0.,    49.,   50.,   51.,   52.,   53.,   54.,
      55.,   56.,   57.,   58.,   183.,  186.,  0.,    0.,    0.,    0.,
      65.,   66.,   67.,   68.,   69.,   70.,   71.,   72.,   73.,   74.,
      231.,  234.,  0.,    0.,    0.,    0.,    291.,  294.,  297.,  300.,
      303.,  306.,  309.,  312.,  315.,  318.,  981.,  990.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    129.,  130.,  131.,  132.,  133.,  134.,
      135.,  136.,  137.,  138.,  423.,  426.,  0.,    0.,    0.,    0.,
      145.,  146.,  147.,  148.,  149.,  150.,  151.,  152.,  153.,  154.,
      471.,  474.,  0.,    0.,    0.,    0.,    161.,  162.,  163.,  164.,
      165.,  166.,  167.,  168.,  169.,  170.,  519.,  522.,  0.,    0.,
      0.,    0.,    177.,  178.,  179.,  180.,  181.,  182.,  183.,  184.,
      185.,  186.,  567.,  570.,  0.,    0.,    0.,    0.,    193.,  194.,
      195.,  196.,  197.,  198.,  199.,  200.,  201.,  202.,  615.,  618.,
      0.,    0.,    0.,    0.,    675.,  678.,  681.,  684.,  687.,  690.,
      693.,  696.,  699.,  702.,  2133., 2142., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    257.,  258.,  259.,  260.,  261.,  262.,  263.,  264.,
      265.,  266.,  807.,  810.,  0.,    0.,    0.,    0.,    273.,  274.,
      275.,  276.,  277.,  278.,  279.,  280.,  281.,  282.,  855.,  858.,
      0.,    0.,    0.,    0.,    289.,  290.,  291.,  292.,  293.,  294.,
      295.,  296.,  297.,  298.,  903.,  906.,  0.,    0.,    0.,    0.,
      305.,  306.,  307.,  308.,  309.,  310.,  311.,  312.,  313.,  314.,
      951.,  954.,  0.,    0.,    0.,    0.,    321.,  322.,  323.,  324.,
      325.,  326.,  327.,  328.,  329.,  330.,  999.,  1002., 0.,    0.,
      0.,    0.,    1059., 1062., 1065., 1068., 1071., 1074., 1077., 1080.,
      1083., 1086., 3285., 3294.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 2}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x8x2) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,
      0., 0., 0., 0., 0., 0., 0., 0., 9.,  10., 11., 12., 13., 14., 15., 16.,
      0., 0., 0., 0., 0., 0., 0., 0., 17., 18., 19., 20., 21., 22., 23., 24.,
      0., 0., 0., 0., 0., 0., 0., 0., 25., 26., 27., 28., 29., 30., 31., 32.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 33., 34., 35., 36., 37., 38., 39., 40.,
      0., 0., 0., 0., 0., 0., 0., 0., 41., 42., 43., 44., 45., 46., 47., 48.,
      0., 0., 0., 0., 0., 0., 0., 0., 49., 50., 51., 52., 53., 54., 55., 56.,
      0., 0., 0., 0., 0., 0., 0., 0., 57., 58., 59., 60., 61., 62., 63., 64.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
      0., 0., 0., 0., 0., 0., 0., 0., 65., 66., 67., 68., 69., 70., 71., 72.,
      0., 0., 0., 0., 0., 0., 0., 0., 73., 74., 75., 76., 77., 78., 79., 80.,
      0., 0., 0., 0., 0., 0., 0., 0., 81., 82., 83., 84., 85., 86., 87., 88.,
      0., 0., 0., 0., 0., 0., 0., 0., 89., 90., 91., 92., 93., 94., 95., 96.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 2}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, SAME3x8x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    1.,    2.,    3.,    4.,    5.,    6.,    7.,    8.,
      9.,    10.,   11.,   12.,   13.,   14.,   15.,   16.,   17.,   18.,
      19.,   20.,   75.,   78.,   81.,   84.,   0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    33.,   34.,   35.,   36.,   37.,   38.,
      39.,   40.,   41.,   42.,   43.,   44.,   45.,   46.,   47.,   48.,
      49.,   50.,   51.,   52.,   171.,  174.,  177.,  180.,  0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    65.,   66.,   67.,   68.,
      69.,   70.,   71.,   72.,   73.,   74.,   75.,   76.,   77.,   78.,
      79.,   80.,   81.,   82.,   83.,   84.,   267.,  270.,  273.,  276.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    97.,   98.,
      99.,   100.,  101.,  102.,  103.,  104.,  105.,  106.,  107.,  108.,
      109.,  110.,  111.,  112.,  113.,  114.,  115.,  116.,  363.,  366.,
      369.,  372.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      129.,  130.,  131.,  132.,  133.,  134.,  135.,  136.,  137.,  138.,
      139.,  140.,  141.,  142.,  143.,  144.,  145.,  146.,  147.,  148.,
      459.,  462.,  465.,  468.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    579.,  582.,  585.,  588.,  591.,  594.,  597.,  600.,
      603.,  606.,  609.,  612.,  615.,  618.,  621.,  624.,  627.,  630.,
      633.,  636.,  1953., 1962., 1971., 1980., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    257.,  258.,
      259.,  260.,  261.,  262.,  263.,  264.,  265.,  266.,  267.,  268.,
      269.,  270.,  271.,  272.,  273.,  274.,  275.,  276.,  843.,  846.,
      849.,  852.,  0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      289.,  290.,  291.,  292.,  293.,  294.,  295.,  296.,  297.,  298.,
      299.,  300.,  301.,  302.,  303.,  304.,  305.,  306.,  307.,  308.,
      939.,  942.,  945.,  948.,  0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    321.,  322.,  323.,  324.,  325.,  326.,  327.,  328.,
      329.,  330.,  331.,  332.,  333.,  334.,  335.,  336.,  337.,  338.,
      339.,  340.,  1035., 1038., 1041., 1044., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    353.,  354.,  355.,  356.,  357.,  358.,
      359.,  360.,  361.,  362.,  363.,  364.,  365.,  366.,  367.,  368.,
      369.,  370.,  371.,  372.,  1131., 1134., 1137., 1140., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    385.,  386.,  387.,  388.,
      389.,  390.,  391.,  392.,  393.,  394.,  395.,  396.,  397.,  398.,
      399.,  400.,  401.,  402.,  403.,  404.,  1227., 1230., 1233., 1236.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    1347., 1350.,
      1353., 1356., 1359., 1362., 1365., 1368., 1371., 1374., 1377., 1380.,
      1383., 1386., 1389., 1392., 1395., 1398., 1401., 1404., 4257., 4266.,
      4275., 4284., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    513.,  514.,  515.,  516.,  517.,  518.,
      519.,  520.,  521.,  522.,  523.,  524.,  525.,  526.,  527.,  528.,
      529.,  530.,  531.,  532.,  1611., 1614., 1617., 1620., 0.,    0.,
      0.,    0.,    0.,    0.,    0.,    0.,    545.,  546.,  547.,  548.,
      549.,  550.,  551.,  552.,  553.,  554.,  555.,  556.,  557.,  558.,
      559.,  560.,  561.,  562.,  563.,  564.,  1707., 1710., 1713., 1716.,
      0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,    577.,  578.,
      579.,  580.,  581.,  582.,  583.,  584.,  585.,  586.,  587.,  588.,
      589.,  590.,  591.,  592.,  593.,  594.,  595.,  596.,  1803., 1806.,
      1809., 1812., 0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.,
      609.,  610.,  611.,  612.,  613.,  614.,  615.,  616.,  617.,  618.,
      619.,  620.,  621.,  622.,  623.,  624.,  625.,  626.,  627.,  628.,
      1899., 1902., 1905., 1908., 0.,    0.,    0.,    0.,    0.,    0.,
      0.,    0.,    641.,  642.,  643.,  644.,  645.,  646.,  647.,  648.,
      649.,  650.,  651.,  652.,  653.,  654.,  655.,  656.,  657.,  658.,
      659.,  660.,  1995., 1998., 2001., 2004., 0.,    0.,    0.,    0.,
      0.,    0.,    0.,    0.,    2115., 2118., 2121., 2124., 2127., 2130.,
      2133., 2136., 2139., 2142., 2145., 2148., 2151., 2154., 2157., 2160.,
      2163., 2166., 2169., 2172., 6561., 6570., 6579., 6588.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 4}};
  const auto padding = PaddingMode::SAME;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
TYPED_TEST(MaxWindow5Stride1Grad, VALID3x8x8x4) {
  using DataType = typename TestFixture::DataType;
  const std::vector<DataType> exp_out = {
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,   10.,  11.,  12.,
      13.,  14.,  15.,  16.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   17.,  18.,  19.,  20.,
      21.,  22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   33.,  34.,  35.,  36.,  37.,  38.,  39.,  40.,
      41.,  42.,  43.,  44.,  45.,  46.,  47.,  48.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      49.,  50.,  51.,  52.,  53.,  54.,  55.,  56.,  57.,  58.,  59.,  60.,
      61.,  62.,  63.,  64.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   65.,  66.,  67.,  68.,  69.,  70.,  71.,  72.,
      73.,  74.,  75.,  76.,  77.,  78.,  79.,  80.,  0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      81.,  82.,  83.,  84.,  85.,  86.,  87.,  88.,  89.,  90.,  91.,  92.,
      93.,  94.,  95.,  96.,  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   97.,  98.,  99.,  100.,
      101., 102., 103., 104., 105., 106., 107., 108., 109., 110., 111., 112.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   113., 114., 115., 116., 117., 118., 119., 120.,
      121., 122., 123., 124., 125., 126., 127., 128., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   129., 130., 131., 132.,
      133., 134., 135., 136., 137., 138., 139., 140., 141., 142., 143., 144.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   145., 146., 147., 148., 149., 150., 151., 152.,
      153., 154., 155., 156., 157., 158., 159., 160., 0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      161., 162., 163., 164., 165., 166., 167., 168., 169., 170., 171., 172.,
      173., 174., 175., 176., 0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
      0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   177., 178., 179., 180.,
      181., 182., 183., 184., 185., 186., 187., 188., 189., 190., 191., 192.};
  const std::array<int, 4> in_shape = {{3, 8, 8, 4}};
  const auto padding = PaddingMode::VALID;
  const auto params = getPoolingParams<5, 1>(in_shape, padding);
  const DataType max_input_val = 2048.0;
  this->test_pool(exp_out, params, max_input_val);
}
